package com.itservice.supporter_navi;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.itservice.supporter_navi.MarathonDataBase.MarathonDataBase;
import com.itservice.supporter_navi.MarathonDataBase.libs.DBUtilities;
import com.itservice.supporter_navi.utilities.CommonUtilities;
import com.itservice.supporter_navi.utilities.GCMSendMsg;


//////////////////////////////
// フレンドリスト画面クラス //
//////////////////////////////
public class FriendListActivity extends Activity implements OnClickListener{
	public Intent intent;
	final static int END_CODE = 1;
	static ArrayList<Tasks> tasks;
	static ListView list;
	static TaskAdapter adapter = null;
	private MarathonDataBase marathonDB; // データベースクラス
	private String m_gcmId = ""; // GCMID
	private String m_regKey = ""; // 認証キー
	private String m_friendName = ""; // フレンド名
	Looper looper;									// スレッドからUI操作の為に使用
	Handler mhandler;								// スレッドからUI操作の為に使用
	boolean loopend=false;
	Context cont = this;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_friendlist);

		//DB接続
		// DBインスタンス取得
		marathonDB = MarathonDataBase.getInstance();
		marathonDB.setContext(this);

		//ListView取得
		list = (ListView)findViewById(R.id.listView1);

		// フレンドリスト再描画
		friendListRedrow();

		//コンテキストメニューのためにリストビューを登録
		registerForContextMenu(list);

		//ボタンを登録
		Button addButton = (Button)findViewById(R.id.buttonNewFriend);
		addButton.setOnClickListener(this);

		//アイテムクリック
		list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
			@Override
			public void onItemClick(AdapterView<?> parent, View view, int position, long id)
			{
				// アイテムクリック時の動作
				Tasks t = tasks.get(position); // クリックした内容の情報を取得する。

				// 状態によって作業を変化させる。
				int status = t.getStatus();
				Log.v(CommonUtilities.LOG_TAG, "onItemClick:position=" + position + " status=" + status);
				switch(status)
				{
				case DBUtilities.FRIEND_STATUS_REGIST_WAITTING: // 登録申請受信状態
					// フレンド申請許可ダイアログを表示する。
					shownFriendPermitDialog(position);
					break;
				case DBUtilities.FRIEND_STATUS_REGIST_PENDING: // 登録待ち状態
				case DBUtilities.FRIEND_STATUS_RUNNER: // 走者表示状態
				case DBUtilities.FRIEND_STATUS_REGISTERED: // フレンド状態
					// ボタンクリック反応なし
					return;
				}
			}
		});


		// インテント情報の取得
		String intentStatus;
		intent = getIntent();
		if(null != intent)
		{
			intentStatus = intent.getStringExtra(CommonUtilities.INTENT_STATUS);
			if(null != intentStatus)
			{
				if(intentStatus.equals(CommonUtilities.INTENT_STATUS_MAIL))
				{
					// インテントのステータスがメールからの起動であった場合
					m_gcmId = intent.getStringExtra(CommonUtilities.INTENT_MAIL_FRIEND_ID);
					m_regKey = intent.getStringExtra(CommonUtilities.INTENT_MAIL_FRIEND_KEY);
					m_friendName = intent.getStringExtra(CommonUtilities.INTENT_MAIL_FRIEND_NAME);
					// フレンド申請ダイアログを表示する。
					Log.v(CommonUtilities.LOG_TAG, "showFriendListDialog!! on Create");
					shownFriendListDialog();
				}
				else if(intentStatus.equals(CommonUtilities.INTENT_STATUS_NOTIFICATION))
				{
					// インテントのステータスがフレンド登録申請受信のNotificationからの起動であった場合
					String friendGcmId = intent.getStringExtra(CommonUtilities.INTENT_FRIEND_ID);

					Log.i(CommonUtilities.LOG_TAG, "ID:"+ friendGcmId);
					// 取得したGCMIDをデータベースから検索する。
					int index = marathonDB.friendIdSearch(friendGcmId);

					Log.i(CommonUtilities.LOG_TAG, "INDEX:"+ index);
					// GCMIDのステータスを確認し、フレンド申請受信中の場合、フレンド登録許可のメッセージを表示する。
					if(-1 != index)
					{
						// フレンド申請許可ダイアログを表示する。
						shownFriendPermitDialog(index);
					}
				}
			}
        }

		new Thread(new Runnable() {
	        @Override
	        public void run() {
	        	loopend=false;
	        	while(loopend == false){
		        	looper = Looper.getMainLooper();
		        	mhandler = new Handler(looper);
		        	mhandler.post(new Runnable() {
	        		@Override
	        		public void run() {
		        			// 画面更新
		        			friendListRedrow();
		        			// 削除処理があれば削除する
		        			int RegNo = marathonDB.getInteger(DBUtilities.FRIEND_NUM, -1);
		        			if(RegNo != -1){
		        				for(int i = 1;i<=RegNo;i++){
		        					boolean Cancel_flg = marathonDB.getBoolean(DBUtilities.FRIEND_CANCEL+i,false);
		        					if(Cancel_flg==true){
		        						CancelDelete(i);
		        						Log.i(CommonUtilities.LOG_TAG,"削除する登録番号:"+ i);
		        						marathonDB.setBoolean(DBUtilities.FRIEND_CANCEL + i,false);
		        						break;
		        					}
		        				}
		        			}
	        			}
		        	});
		        	// ディレイ処理
					try {
	        			// 無限ループを0.5秒止める(これがないと延々この処理だけが動いてしまい、送信処理をうけつけなくなる、むしろ落ちる)
						Thread.sleep(CommonUtilities.FRIEND_LIST_RELOAD);
					} catch(InterruptedException except) {
						except.printStackTrace();
					}
	        	}
	        }
		}).start();
	}


	@Override
	public void onNewIntent(Intent intent) {
		// インテント情報の取得
		String intentStatus;
		if(null != intent)
		{
			intentStatus = intent.getStringExtra(CommonUtilities.INTENT_STATUS);
			if(null != intentStatus)
			{
				if(intentStatus.equals(CommonUtilities.INTENT_STATUS_MAIL))
				{
					// インテントのステータスがメールからの起動であった場合
					m_gcmId = intent.getStringExtra(CommonUtilities.INTENT_MAIL_FRIEND_ID);
					m_regKey = intent.getStringExtra(CommonUtilities.INTENT_MAIL_FRIEND_KEY);
					m_friendName = intent.getStringExtra(CommonUtilities.INTENT_MAIL_FRIEND_NAME);

					// フレンド申請ダイアログを表示する。
					Log.v(CommonUtilities.LOG_TAG, "showFriendListDialog!! on Create");
					shownFriendListDialog();
				}
				else if(intentStatus.equals(CommonUtilities.INTENT_STATUS_NOTIFICATION))
				{
					// インテントのステータスがフレンド登録申請受信のNotificationからの起動であった場合
					String friendGcmId = intent.getStringExtra(CommonUtilities.INTENT_FRIEND_ID);

					Log.i(CommonUtilities.LOG_TAG, "ID:"+ friendGcmId);
					// 取得したGCMIDをデータベースから検索する。
					int index = marathonDB.friendIdSearch(friendGcmId);

					Log.i(CommonUtilities.LOG_TAG, "INDEX:"+ index);
					// GCMIDのステータスを確認し、フレンド申請受信中の場合、フレンド登録許可のメッセージを表示する。
					if(-1 != index)
					{
						// フレンド申請許可ダイアログを表示する。
						shownFriendPermitDialog(index);
					}
				}
			}
        }
	}

	public void onDestroy(Bundle savedInstanceState){
		m_gcmId = "";
		m_regKey = "";
		m_friendName = "";
	}

	//ボタンクリック時のリスナ
	@Override
	public void onClick(View v){
		switch(v.getId())
		{
		//新規登録ボタンが押されたら
		case R.id.buttonNewFriend:
			shownFriendListDialog();
            break;
		}
	}

	//コンテキストメニュー 削除処理
	@Override
	public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo){
		super.onCreateContextMenu(menu, view, menuInfo);

		AdapterContextMenuInfo adapterinfo = (AdapterContextMenuInfo)menuInfo;

		menu.setHeaderTitle(tasks.get(adapterinfo.position).getName());
		menu.add(0, END_CODE, 0, R.string.Friend_Context_Delete);
	}

	//登録失敗時の削除処理
	public void CancelDelete(int id){
		if(id != -1)
		{
			int delete_id=-1;
			String removeName="";
			//フレンドリストの現在の最大数を取得
			//DBからフレンド数を一つデクリメントする。
			int friendNum = marathonDB.getInteger(DBUtilities.FRIEND_NUM, 0);

			for(int i=0;i<friendNum;i++){
				String removeId = tasks.get(i).getId();
				if(removeId.equals(marathonDB.getText(DBUtilities.FRIEND_ID +id, ""))){
					delete_id = i;
					removeName = tasks.get(i).getName();
					break;
				}
			}
			//Log.v(CommonUtilities.LOG_TAG, "friendNum:" + friendNum+ " lastNo:" + lastNo+ " removeNo:" + removeNo);

			// フレンドリストの一番最後にある項目を削除する番号に移動させる。
			// 削除する物が一番最後の場合はやる必要はない。
			if(id != friendNum)
			{
				// 一番最後のフレンドリストを取得
				String lastFriendId = marathonDB.getText(DBUtilities.FRIEND_ID + friendNum, "");
				String lastFriendName = marathonDB.getText(DBUtilities.FRIEND_NAME + friendNum, "");
				int lastFriendStatus = marathonDB.getInteger(DBUtilities.FRIEND_STATUS + friendNum, 0);
				Boolean lastFriendFlg = marathonDB.getBoolean(DBUtilities.FRIEND_CHAGE_FLG + friendNum, false);
				String lastFriendLat = marathonDB.getText(DBUtilities.FRIEND_LATITUDE + friendNum, "");
				String lastFriendLon = marathonDB.getText(DBUtilities.FRIEND_LONGITUDE + friendNum, "");

				// 削除対象Noに書き込み
				marathonDB.setText(DBUtilities.FRIEND_ID + id, lastFriendId);
				marathonDB.setText(DBUtilities.FRIEND_NAME + id, lastFriendName);
				marathonDB.setInteger(DBUtilities.FRIEND_STATUS + id, lastFriendStatus);
				marathonDB.setBoolean(DBUtilities.FRIEND_CHAGE_FLG + id, lastFriendFlg);
				marathonDB.setText(DBUtilities.FRIEND_LATITUDE + id, lastFriendLat);
				marathonDB.setText(DBUtilities.FRIEND_LONGITUDE + id, lastFriendLon);
			}

			//DBから削除
			marathonDB.removeText(DBUtilities.FRIEND_ID + friendNum);
			marathonDB.removeText(DBUtilities.FRIEND_NAME + friendNum);
			marathonDB.removeText(DBUtilities.FRIEND_STATUS+ friendNum);
			marathonDB.removeText(DBUtilities.FRIEND_CHAGE_FLG + friendNum);
			marathonDB.removeText(DBUtilities.FRIEND_LATITUDE + friendNum);
			marathonDB.removeText(DBUtilities.FRIEND_LONGITUDE + friendNum);

			if(friendNum != 0)
			{
				friendNum--;
				marathonDB.setInteger(DBUtilities.FRIEND_NUM, friendNum );
			}
			//ArrayListから削除
			tasks.remove(delete_id);
			TaskSort(tasks);

			//アダプタの書き換え
			adapter.remove(removeName);
			adapter.notifyDataSetChanged();
		}
	}

	//コンテキストメニュークリック時のリスナ
	@Override
	public boolean onContextItemSelected(MenuItem item){
		AdapterContextMenuInfo info = (AdapterContextMenuInfo)item.getMenuInfo();

		switch(item.getItemId()){
		//削除
		case END_CODE:
			String removeId = tasks.get(info.position).getId();
			String removeName = tasks.get(info.position).getName();
			int registID = tasks.get(info.position).getRegistID();

			if(registID > 0)
			{
				//フレンドリストの現在の最大数を取得
				//DBからフレンド数を一つデクリメントする。
				int friendNum = marathonDB.getInteger(DBUtilities.FRIEND_NUM, 0);

				//Log.v(CommonUtilities.LOG_TAG, "friendNum:" + friendNum+ " lastNo:" + lastNo+ " removeNo:" + removeNo);

				// フレンドリストの一番最後にある項目を削除する番号に移動させる。
				// 削除する物が一番最後の場合はやる必要はない。
				if(registID != friendNum)
				{
					// 一番最後のフレンドリストを取得
					String lastFriendId = marathonDB.getText(DBUtilities.FRIEND_ID + friendNum, "");
					String lastFriendName = marathonDB.getText(DBUtilities.FRIEND_NAME + friendNum, "");
					int lastFriendStatus = marathonDB.getInteger(DBUtilities.FRIEND_STATUS + friendNum, 0);
					Boolean lastFriendFlg = marathonDB.getBoolean(DBUtilities.FRIEND_CHAGE_FLG + friendNum, false);
					String lastFriendLat = marathonDB.getText(DBUtilities.FRIEND_LATITUDE + friendNum, "");
					String lastFriendLon = marathonDB.getText(DBUtilities.FRIEND_LONGITUDE + friendNum, "");

					// 削除対象Noに書き込み
					marathonDB.setText(DBUtilities.FRIEND_ID + registID, lastFriendId);
					marathonDB.setText(DBUtilities.FRIEND_NAME + registID, lastFriendName);
					marathonDB.setInteger(DBUtilities.FRIEND_STATUS + registID, lastFriendStatus);
					marathonDB.setBoolean(DBUtilities.FRIEND_CHAGE_FLG + registID, lastFriendFlg);
					marathonDB.setText(DBUtilities.FRIEND_LATITUDE + registID, lastFriendLat);
					marathonDB.setText(DBUtilities.FRIEND_LONGITUDE + registID, lastFriendLon);
				}

				// 一番最後のフレンドリストを取得
				String FriendId = marathonDB.getText(DBUtilities.FRIEND_ID + friendNum, "");
				String FriendName = marathonDB.getText(DBUtilities.FRIEND_NAME + friendNum, "");
				String MyID = marathonDB.getText(DBUtilities.USER_ID,"noID");

				String[] ids = {removeId};

				Log.i(CommonUtilities.LOG_TAG, "friendNum:" + friendNum+ " FriendID:" + FriendId + " FriendName:" + FriendName);

				SendAsyncTask task = new SendAsyncTask(ids,CommonUtilities.M_TYPE_FRIEND_RELEASE + "," + MyID + ",");
				task.execute();

				//ArrayListから削除対象をIDで判定して削除する
				for(int i=0; i<friendNum;i++){
					String deleteId = tasks.get(i).getId();
					if(removeId.equals(deleteId)){
						tasks.remove(i);
						break;
					}
				}

				//DBから削除
				marathonDB.removeText(DBUtilities.FRIEND_ID + friendNum);
				marathonDB.removeText(DBUtilities.FRIEND_NAME + friendNum);
				marathonDB.removeText(DBUtilities.FRIEND_STATUS+ friendNum);
				marathonDB.removeText(DBUtilities.FRIEND_CHAGE_FLG + friendNum);
				marathonDB.removeText(DBUtilities.FRIEND_LATITUDE + friendNum);
				marathonDB.removeText(DBUtilities.FRIEND_LONGITUDE + friendNum);


				if(friendNum != 0)
				{
					friendNum--;
					marathonDB.setInteger(DBUtilities.FRIEND_NUM, friendNum );
				}

				TaskSort(tasks);
				//アダプタの書き換え
				adapter.remove(removeName);
				adapter.notifyDataSetChanged();
				return true;

			}
			else
			{
				return false;
			}
		default:
			Toast.makeText(this, "default", Toast.LENGTH_SHORT).show();
			return super.onContextItemSelected(item);
		}
	}

	// フレンドリスト新規登録ダイアログ画面表示メソッド
	// 表示完了後、リストの更新も行う。
	private void shownFriendListDialog()
	{

		Log.v(CommonUtilities.LOG_TAG, "showFriendListDialog!! ");
		Dialog dlg = new FriendListDialog(FriendListActivity.this, m_gcmId, m_regKey, m_friendName);
		dlg.show();
	}

	/*
	 * フレンド申請許可ダイアログ
	 * parameter:index:ダイアログが表示する、フレンドのインデックス番号
	 */
	private void shownFriendPermitDialog(int index)
	{
		final int friendId = index;
		Log.v(CommonUtilities.LOG_TAG, "shownFriendPermitDialog");
		if(tasks.get(friendId).getStatus() == DBUtilities.FRIEND_STATUS_REGIST_WAITTING)
		{
			// 指定されたインデックスが登録許可待ちである場合のみダイアログ表示
			new AlertDialog.Builder(FriendListActivity.this)
	        .setTitle("フレンド登録許可")
	        .setMessage(tasks.get(friendId).getName() + "さんから登録申請を許可しますか？")
	        .setPositiveButton(
	          "Yes",
	          new DialogInterface.OnClickListener() {
	            @Override
	            public void onClick(DialogInterface dialog, int which) {
	            	// Yesの場合は、フレンド申請許可をGCMへ投げる。
	    			// 以下準備が正常にできた時のみ動作
	    			String[] ids = {tasks.get(friendId).getId()};
	    			String userName = marathonDB.getText(DBUtilities.USER_NAME, "");
	    			String userId = marathonDB.getText(DBUtilities.USER_ID, "");
	    			if(userName.equals("") || userId.equals(""))
	    			{
	    				// 送信するためのユーザ名とIDがおかしい場合、トーストを表示する。
	    				Toast.makeText(FriendListActivity.this, "ユーザ登録が正常に行えておりません。", Toast.LENGTH_LONG).show();
	    			}
	    			else
	    			{
	    				// フレンド申請許可を送信
	    				SendAsyncTask task = new SendAsyncTask(ids, CommonUtilities.M_TYPE_FRIEND_APP_OK + ","+ userId + "," + userName + ",");
	    				task.execute();
	    				int id = friendId+1;
	    				marathonDB.setInteger(DBUtilities.FRIEND_STATUS + id,DBUtilities.FRIEND_STATUS_REGISTERED);
	    			}
	            }
	          })
	        .setNegativeButton(
	          "No",
	          new DialogInterface.OnClickListener() {
	            @Override
	            public void onClick(DialogInterface dialog, int which) {
	            	String[] ids = {tasks.get(friendId).getId()};
	    			String userId = marathonDB.getText(DBUtilities.USER_ID, "");
	            	// キャンセル時はキャンセルされたことを相手に送ります。
	            	SendAsyncTask task = new SendAsyncTask(ids, CommonUtilities.M_TYPE_FRIEND_CANCEL + ","+ userId + ",");
    				task.execute();
    				int RegistID = tasks.get(friendId).getRegistID();
    				CancelDelete(RegistID);
	            }
	        })
	        .show();

			// フレンドリスト再描画
			friendListRedrow();
		}
	}

	/*
	 * フレンドリストの再描画処理
	 */
	private void friendListRedrow()
	{
		//フレンドリストをDBから取得しなおす。
		tasks = CreateFriendList();
		// フレンドリストを整列
		TaskSort(tasks);
		adapter = new TaskAdapter(getApplicationContext(), R.layout.activity_friendlist, tasks);
		list.setAdapter(adapter);
	}

	private ArrayList<Tasks> CreateFriendList()
	{
		int friendNum = marathonDB.getInteger(DBUtilities.FRIEND_NUM, 0);
		ArrayList<Tasks> tasks = new ArrayList<Tasks>();

		for(int i = 1; i <= friendNum; i++)
		{
			String id = marathonDB.getText(DBUtilities.FRIEND_ID + i, "");
			String name = marathonDB.getText(DBUtilities.FRIEND_NAME + i, "");
			int status = marathonDB.getInteger(DBUtilities.FRIEND_STATUS + i, 0);
			//Log.v(CommonUtilities.LOG_TAG, "FriendList[" + i + "]id[" + id + "]name[" + name + "]status[" + status + "]");
			if(id.equals(""))
			{
				//Log.v(CommonUtilities.LOG_TAG, "FriendList[" + i + "]id[" + id + "]");
			}
			else
			{
				Tasks t = new Tasks(id, name, status,i);
				tasks.add(t);
			}
		}

		return tasks;
	}

	public void TaskSort(ArrayList<Tasks> tsk)
	{
		Collections.sort(tsk, new Comparator<Tasks>(){
			@Override
			public int compare(Tasks t1, Tasks t2) {
				if(t1.getStatus() < t2.getStatus())
				{
					return -1;
				}
				else if(t1.getStatus() > t2.getStatus())
				{
					return 1;
				}
				else
				{
					return t1.getName().compareTo(t2.getName());
				}
			}
		});
	}

	public class TaskAdapter extends ArrayAdapter{
	private ArrayList<Tasks> items;
	private LayoutInflater inflater;

	@SuppressWarnings("unchecked")
	public TaskAdapter(Context context, int textViewResourceId, ArrayList<Tasks> items) {
		super(context, textViewResourceId, items);
		this.items = items;
		this.inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
	}

	@SuppressWarnings("unchecked")
	public void insert(String str, int position){
		super.insert(str, position);
	}

	@SuppressWarnings("unchecked")
	public void remove(String str){
		super.remove(str);
	}

	 @SuppressWarnings("unchecked")
	public void add(String str){
		super.add(str);
	}

	 @Override
	 public View getView(int position, View convertView, ViewGroup parent){
		View view = convertView;
		if(view == null){
			view = inflater.inflate(R.layout.friendlist, null);
		}

		Tasks item = items.get(position);
		if(item != null){
			int itemStatus = item.getStatus();
			//Log.v(CommonUtilities.LOG_TAG, "itemStatus[" + itemStatus + "]position[" + position + "]");


			//TextView(名前)に関する事柄
			TextView friendName = (TextView)view.findViewById(R.id.friend_name);
			if(friendName != null){
				friendName.setText(item.getName());
			}

			//TextView(ステータス)に関する事柄
			TextView friendStatus = (TextView)view.findViewById(R.id.friend_status);
			if(friendStatus != null){
				if((itemStatus == DBUtilities.FRIEND_STATUS_REGISTERED) || (itemStatus == DBUtilities.FRIEND_STATUS_RUNNER))
				{
					// TextView(ステータス)の表示を消す。
					friendStatus.setVisibility(View.GONE);
					//Log.v(CommonUtilities.LOG_TAG, "friendStatus GONE");
				}
				else if (itemStatus == DBUtilities.FRIEND_STATUS_REGIST_PENDING)
				{
					friendStatus.setVisibility(View.VISIBLE);
					friendStatus.setText("申請中");
					//Log.v(CommonUtilities.LOG_TAG, "friendStatus FRIEND_STATUS_REGIST_PENDING");
				}
				else if (itemStatus == DBUtilities.FRIEND_STATUS_REGIST_WAITTING)
				{
					friendStatus.setVisibility(View.VISIBLE);
					friendStatus.setText("申請受信中");
					//Log.v(CommonUtilities.LOG_TAG, "friendStatus FRIEND_STATUS_REGIST_WAITTING");
				}
			}

			//CheckBoxに関する事柄
			CheckBox ck = (CheckBox)view.findViewById(R.id.friend_check);
			if((itemStatus == DBUtilities.FRIEND_STATUS_REGISTERED) || (itemStatus == DBUtilities.FRIEND_STATUS_RUNNER))
			{
				final int p = position;
				// チェックボックスの表示
				ck.setVisibility(View.VISIBLE);

				//CheckBox Checkリスナ
				ck.setOnCheckedChangeListener(new OnCheckedChangeListener(){
					@Override
					public void onCheckedChanged(CompoundButton buttonView, boolean isChecked){
						Tasks friendTask = tasks.get(p);
						int status = friendTask.getStatus();
						if((status == DBUtilities.FRIEND_STATUS_REGISTERED) || (status == DBUtilities.FRIEND_STATUS_RUNNER))
						{
							// チェックが入った時の処理
							if(isChecked){
								int check_cnt = marathonDB.getInteger(DBUtilities.FRIEND_CHECK_CNT,0);
								Log.i(CommonUtilities.LOG_TAG, "チェック数:"+ check_cnt);
								// ランナー表示数がマックスに達していない時の処理
								if(check_cnt <= CommonUtilities.RUNNER_MAX){
									friendTask.setStatus(DBUtilities.FRIEND_STATUS_RUNNER);
									// 登録番号の取得
									int id = friendTask.getRegistID();
									// フレンド状態を位置情報取得対象に変更
									marathonDB.setInteger(DBUtilities.FRIEND_STATUS+id, DBUtilities.FRIEND_STATUS_RUNNER);
									// 色の割り当てが行われているかをチェック
									int usecolor = marathonDB.getInteger(DBUtilities.FRIEND_COLOR + id, -1);
									// 割り当てが行われていない場合のみ処理を実行
									if(usecolor == -1){
										// 使っていない色をランナーに割りあて
										for(int i=0;i<CommonUtilities.CURSOR_COLOR_TYPE;i++){
											// 色の使用状況を取得
											boolean used = marathonDB.getBoolean(DBUtilities.FRIEND_COLOR_USED + i, false);
											Log.i(CommonUtilities.LOG_TAG,"色："+ i + " 使用フラグ："+used);
											// 使われていない場合
											if(used == false){
												// 使用する色の使用状況を使用状態へ
												marathonDB.setBoolean(DBUtilities.FRIEND_COLOR_USED + i,true);
												// 使用する色をフレンドに設定する
												marathonDB.setInteger(DBUtilities.FRIEND_COLOR + id, i);
												Log.i(CommonUtilities.LOG_TAG,"ID："+ id + " 使用色："+i);
												break;
											}
										}
										check_cnt++;
										marathonDB.setInteger(DBUtilities.FRIEND_CHECK_CNT, check_cnt);
									}

								}else{
									// もしマックスに達していた場合チェックボックスを反転させる
									buttonView.setChecked(false);
								}
							} else { // チェックが外れた時の処理
								friendTask.setStatus(DBUtilities.FRIEND_STATUS_REGISTERED);
								// 登録番号の取得
								int id = friendTask.getRegistID();
								// フレンドの状態を位置情報取得非対象へ変更
								marathonDB.setInteger(DBUtilities.FRIEND_STATUS+id, DBUtilities.FRIEND_STATUS_REGISTERED);
								// 使用している色を取得
								int usecolor = marathonDB.getInteger(DBUtilities.FRIEND_COLOR + id, -1);
								// 使用している色がある場合
								if(usecolor != -1){
									Log.i(CommonUtilities.LOG_TAG, "使ってた色：[" + usecolor + "]");
									// 使用していた色の使用状況を未使用に変更
									marathonDB.setBoolean(DBUtilities.FRIEND_COLOR_USED + usecolor, false);
									// 割りあてられている色を未設定へ変更
									marathonDB.setInteger(DBUtilities.FRIEND_COLOR + id, -1);
									// 位置情報取得非対象になる為、マップからカーソルを除外するフラグを設定
									marathonDB.setBoolean(DBUtilities.FRIEND_DISPLAY_END + id, true);
									// ランナー対応表から対象を除外する為に使っていた色を取得
									marathonDB.setInteger(DBUtilities.FRIEND_COLOR_OLD + id, usecolor);
								}
								int check_cnt = marathonDB.getInteger(DBUtilities.FRIEND_CHECK_CNT,0);
								if(check_cnt != 0){
									check_cnt--;
									marathonDB.setInteger(DBUtilities.FRIEND_CHECK_CNT, check_cnt);
								}
							}
						}
					}
				});

				//Log.v(CommonUtilities.LOG_TAG, "itemStatus[" + itemStatus + "]position[" + position + "]");

				if(itemStatus == DBUtilities.FRIEND_STATUS_RUNNER){
					ck.setChecked(true);
				}
				else{
					ck.setChecked(false);
				}
			}
			else
			{
				// チェックボックスの表示を消す。
				ck.setVisibility(View.GONE);
			}
		}
		return view;
	}
}

	@Override
	protected void onResume() {
		super.onResume();
	}

	@Override
	protected void onPause() {
		super.onPause();
		loopend = true;
	}

	//======================================================================================
	// 送信処理へ送信内容を受渡し
	//======================================================================================
	public class SendAsyncTask extends AsyncTask<String, String, Long> {
		private String[] mRegIds;	// 送信先ID
		private String mMsg;		// 送信メッセージ

		// コンストラクタ
		public SendAsyncTask(String[] regId , String msg) {
		    this.mRegIds = regId;
		    this.mMsg = msg;
		}

		/**
		 * バックグランドで行う処理
		 */
		@Override
		protected Long doInBackground(String... params) {
			// 送信用メソッドに送信内容を渡す
		    GCMSendMsg gcmsendmsg = new GCMSendMsg();
		    Boolean ret = false;

		    for(int loop = 0; loop < 5; loop++)
		    {
		    	ret = gcmsendmsg.SendMsg(mRegIds, mMsg);
		    	if(true == ret) break;
		    }

		    return null;
		}
	}
}

//////////////////////////
// ListView表示用クラス //
//////////////////////////
class Tasks {
	private String id;		// ID
	private String name;	// 名前
	private int status;		// ステータス
	private int registID;

	// コンストラクタ
	Tasks(String id, String name, int status ,int regid){
		this.id = id;
		this.name = name;
		this.status = status;
		this.registID = regid;
	}

	// ID取得
	public String getId(){
		return this.id;
	}
	// ID設定
	public void setId(String id){
		this.id = id;
	}

	// 名前取得
	public String getName(){
		return this.name;
	}
	// 名前設定
	public void setName(String name){
		this.name = name;
	}

	// 登録番号取
	public int getRegistID(){
		return this.registID;
	}

	// ステータス取得
	public int getStatus(){
		return this.status;
	}
	// ステータス設定
	public void setStatus(int status){
		this.status = status;
	}
}
